package com.micro.ai.gateway.controller;

import com.micro.ai.commons.constant.ErrorCodeEnum;
import com.micro.ai.commons.domain.ApiResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

/**
 * 服务降级处理控制器
 * 当熔断器打开时，返回降级响应
 * 
 * @author micro-ai
 * @since 0.0.1
 */
@Slf4j
@RestController
@RequestMapping("/fallback")
public class FallbackController {

    /**
     * 模板服务降级
     */
    @GetMapping("/template")
    @PostMapping("/template")
    public Mono<ApiResponse<String>> templateFallback() {
        log.warn("模板服务熔断降级");
        return Mono.just(ApiResponse.error(
            ErrorCodeEnum.B0002.getCode(),
            "模板服务暂时不可用，请稍后重试"
        ));
    }

    /**
     * Agent服务降级
     */
    @GetMapping("/agent")
    @PostMapping("/agent")
    public Mono<ApiResponse<String>> agentFallback() {
        log.warn("Agent服务熔断降级");
        return Mono.just(ApiResponse.error(
            ErrorCodeEnum.B0002.getCode(),
            "Agent服务暂时不可用，请稍后重试"
        ));
    }

    /**
     * 工作流服务降级
     */
    @GetMapping("/workflow")
    @PostMapping("/workflow")
    public Mono<ApiResponse<String>> workflowFallback() {
        log.warn("工作流服务熔断降级");
        return Mono.just(ApiResponse.error(
            ErrorCodeEnum.B0002.getCode(),
            "工作流服务暂时不可用，请稍后重试"
        ));
    }

    /**
     * 训练服务降级
     */
    @GetMapping("/training")
    @PostMapping("/training")
    public Mono<ApiResponse<String>> trainingFallback() {
        log.warn("训练服务熔断降级");
        return Mono.just(ApiResponse.error(
            ErrorCodeEnum.B0002.getCode(),
            "训练服务暂时不可用，请稍后重试"
        ));
    }

    /**
     * 认证服务降级
     */
    @GetMapping("/auth")
    @PostMapping("/auth")
    public Mono<ApiResponse<String>> authFallback() {
        log.warn("认证服务熔断降级");
        return Mono.just(ApiResponse.error(
            ErrorCodeEnum.B0002.getCode(),
            "认证服务暂时不可用，请稍后重试"
        ));
    }

    /**
     * 默认降级处理
     */
    @GetMapping("/default")
    @PostMapping("/default")
    public Mono<ApiResponse<String>> defaultFallback() {
        log.warn("服务熔断降级");
        return Mono.just(ApiResponse.error(
            ErrorCodeEnum.B0002.getCode(),
            "服务暂时不可用，请稍后重试"
        ));
    }
}

